<?php

/**
 * ECSHOP 搜索程序
 * ============================================================================
 * * 版权所有 2005-2012 上海商派网络科技有限公司，并保留所有权利。
 * 网站地址: http://www.ecshop.com；
 * ----------------------------------------------------------------------------
 * 这不是一个自由软件！您只能在不用于商业目的的前提下对程序代码进行修改和
 * 使用；不允许对程序代码以任何形式任何目的的再发布。
 * ============================================================================
 * $Author: sxc_shop $
 * $Id: search.php 16908 2009-12-18 08:25:08Z sxc_shop $
*/

define('IN_ECS', true);
define('ECS_ADMIN', true);
if (empty($_GET['encode']))
{
	$string = array_merge($_GET, $_POST);
	if (get_magic_quotes_gpc())
	{
		require(dirname(__FILE__) . '/../includes/lib_base.php');
		//require(dirname(__FILE__) . '/includes/lib_common.php');

		$string = stripslashes_deep($string);
	}
	$string['search_encode_time'] = time();
	$string = str_replace('+', '%2b', base64_encode(serialize($string)));

	header("Location: search.php?encode=$string\n");

	exit;
}
else
{
	$string = base64_decode(trim($_GET['encode']));
	if ($string !== false)
	{
		$string = unserialize($string);
		if ($string !== false)
		{
			/* 用户在重定向的情况下当作一次访问 */
			if (!empty($string['search_encode_time']))
			{
				if (time() > $string['search_encode_time'] + 2)
				{
					define('INGORE_VISIT_STATS', true);
				}
			}
			else
			{
				define('INGORE_VISIT_STATS', true);
			}
		}
		else
		{
			$string = array();
		}
	}
	else
	{
		$string = array();
	}
}

require(dirname(__FILE__) . '/includes/init.php');

$_REQUEST = array_merge($_REQUEST, addslashes_deep($string));

$_REQUEST['act'] = !empty($_REQUEST['act']) ? trim($_REQUEST['act']) : '';
if ($_SESSION['user_id'] > 0)
{
	$smarty->assign('user_name', $_SESSION['user_name']);

}
/*------------------------------------------------------ */
//-- 高级搜索
/*------------------------------------------------------ */
if ($_REQUEST['act'] == 'advanced_search')
{
	$goods_type = !empty($_REQUEST['goods_type']) ? intval($_REQUEST['goods_type']) : 0;
	$attributes = get_seachable_attributes($goods_type);
	$smarty->assign('goods_type_selected', $goods_type);
	$smarty->assign('goods_type_list',	 $attributes['cate']);
	$smarty->assign('goods_attributes',	$attributes['attr']);

	assign_template();
	assign_dynamic('search');
	$position = assign_ur_here(0, $_LANG['advanced_search']);
	$smarty->assign('page_title', $position['title']);	// 页面标题
	$smarty->assign('ur_here',	$position['ur_here']);  // 当前位置

	$smarty->assign('categories', get_categories_tree()); // 分类树
	$smarty->assign('helps',	  get_shop_help());	   // 网店帮助
	$smarty->assign('top_goods',  get_top10());		   // 销售排行
	$smarty->assign('promotion_info', get_promotion_info());
	$smarty->assign('cat_list',   cat_list(0, 0, true, 2, false));
	$smarty->assign('brand_list', get_brand_list());
	$smarty->assign('action',	 'form');
	$smarty->assign('use_storage', $_CFG['use_storage']);

	$smarty->display('search.dwt');

	exit;
}
/*------------------------------------------------------ */
//-- 搜索结果
/*------------------------------------------------------ */
else
{
	$_REQUEST['keywords']   = !empty($_REQUEST['keywords'])   ? trim($_REQUEST['keywords'])	 : '';
	$_REQUEST['brand']	  = !empty($_REQUEST['brand'])	  ? intval($_REQUEST['brand'])	  : 0;
	$_REQUEST['category']   = !empty($_REQUEST['category'])   ? intval($_REQUEST['category'])   : 0;
	$_REQUEST['min_price']  = !empty($_REQUEST['min_price'])  ? intval($_REQUEST['min_price'])  : 0;
	$_REQUEST['max_price']  = !empty($_REQUEST['max_price'])  ? intval($_REQUEST['max_price'])  : 0;
	$_REQUEST['goods_type'] = !empty($_REQUEST['goods_type']) ? intval($_REQUEST['goods_type']) : 0;
	$_REQUEST['sc_ds']	  = !empty($_REQUEST['sc_ds']) ? intval($_REQUEST['sc_ds']) : 0;
	$_REQUEST['outstock']   = !empty($_REQUEST['outstock']) ? 1 : 0;

	$action = '';
	if (isset($_REQUEST['action']) && $_REQUEST['action'] == 'form')
	{
		/* 要显示高级搜索栏 */
		$adv_value['keywords']  = htmlspecialchars(stripcslashes($_REQUEST['keywords']));
		$adv_value['brand']	 = $_REQUEST['brand'];
		$adv_value['min_price'] = $_REQUEST['min_price'];
		$adv_value['max_price'] = $_REQUEST['max_price'];
		$adv_value['category']  = $_REQUEST['category'];

		$attributes = get_seachable_attributes($_REQUEST['goods_type']);

		/* 将提交数据重新赋值 */
		foreach ($attributes['attr'] AS $key => $val)
		{
			if (!empty($_REQUEST['attr'][$val['id']]))
			{
				if ($val['type'] == 2)
				{
					$attributes['attr'][$key]['value']['from'] = !empty($_REQUEST['attr'][$val['id']]['from']) ? trim($_REQUEST['attr'][$val['id']]['from']) : '';
					$attributes['attr'][$key]['value']['to']   = !empty($_REQUEST['attr'][$val['id']]['to'])   ? trim($_REQUEST['attr'][$val['id']]['to'])   : '';
				}
				else
				{
					$attributes['attr'][$key]['value'] = !empty($_REQUEST['attr'][$val['id']]) ? trim($_REQUEST['attr'][$val['id']]) : '';
				}
			}
		}
		if ($_REQUEST['sc_ds'])
		{
			$smarty->assign('scck',			'checked');
		}
		$smarty->assign('adv_val',			 $adv_value);
		$smarty->assign('goods_type_list',	 $attributes['cate']);
		$smarty->assign('goods_attributes',	$attributes['attr']);
		$smarty->assign('goods_type_selected', $_REQUEST['goods_type']);
		$smarty->assign('cat_list',			cat_list(0, $adv_value['category'], true, 2, false));
		$smarty->assign('brand_list',		  get_brand_list());
		$smarty->assign('action',			  'form');
		$smarty->assign('use_storage',		  $_CFG['use_storage']);

		$action = 'form';
	}

	/* 初始化搜索条件 */
	$keywords  = '';
	$tag_where = '';
	if (!empty($_REQUEST['keywords']))
	{
		$arr = array();
		if (stristr($_REQUEST['keywords'], ' AND ') !== false)
		{
			/* 检查关键字中是否有AND，如果存在就是并 */
			$arr		= explode('AND', $_REQUEST['keywords']);
			$operator   = " AND ";
		}
		elseif (stristr($_REQUEST['keywords'], ' OR ') !== false)
		{
			/* 检查关键字中是否有OR，如果存在就是或 */
			$arr		= explode('OR', $_REQUEST['keywords']);
			$operator   = " OR ";
		}
		elseif (stristr($_REQUEST['keywords'], ' + ') !== false)
		{
			/* 检查关键字中是否有加号，如果存在就是或 */
			$arr		= explode('+', $_REQUEST['keywords']);
			$operator   = " OR ";
		}
		else
		{
			/* 检查关键字中是否有空格，如果存在就是并 */
			$arr		= explode(' ', $_REQUEST['keywords']);
			$operator   = " AND ";
		}

		$keywords = 'AND (';
		$goods_ids = array();
		foreach ($arr AS $key => $val)
		{
			if ($key > 0 && $key < count($arr) && count($arr) > 1)
			{
				$keywords .= $operator;
			}
			$val		= mysql_like_quote(trim($val));
			$sc_dsad	= $_REQUEST['sc_ds'] ? " OR goods_desc LIKE '%$val%'" : '';
			$keywords  .= "(goods_name LIKE '%$val%' OR goods_sn LIKE '%$val%' OR keywords LIKE '%$val%' $sc_dsad)";

			$sql = 'SELECT DISTINCT goods_id FROM ' . $ecs->table('tag') . " WHERE tag_words LIKE '%$val%' ";
			$res = $db->query($sql);
			while ($row = $db->FetchRow($res))
			{
				$goods_ids[] = $row['goods_id'];
			}

			$db->autoReplace($ecs->table('keywords'), array('date' => local_date('Y-m-d'),
				'searchengine' => 'ecshop', 'keyword' => $val, 'count' => 1), array('count' => 1));
		}
		$keywords .= ')';

		$goods_ids = array_unique($goods_ids);
		$tag_where = implode(',', $goods_ids);
		if (!empty($tag_where))
		{
			$tag_where = 'OR g.goods_id ' . db_create_in($tag_where);
		}
	}

	$category   = !empty($_REQUEST['category']) ? intval($_REQUEST['category'])		: 0;
	$categories = ($category > 0)			   ? ' AND ' . get_children($category)	: '';
	$brand	  = $_REQUEST['brand']			? " AND brand_id = '$_REQUEST[brand]'" : '';
	$outstock   = !empty($_REQUEST['outstock']) ? " AND g.goods_number > 0 "		   : '';

	$min_price  = $_REQUEST['min_price'] != 0							   ? " AND g.shop_price >= '$_REQUEST[min_price]'" : '';
	$max_price  = $_REQUEST['max_price'] != 0 || $_REQUEST['min_price'] < 0 ? " AND g.shop_price <= '$_REQUEST[max_price]'" : '';

	/* 排序、显示方式以及类型 */
	$default_display_type = $_CFG['show_order_type'] == '0' ? 'list' : ($_CFG['show_order_type'] == '1' ? 'grid' : 'text');
	$default_sort_order_method = $_CFG['sort_order_method'] == '0' ? 'DESC' : 'ASC';
	$default_sort_order_type   = $_CFG['sort_order_type'] == '0' ? 'goods_id' : ($_CFG['sort_order_type'] == '1' ? 'shop_price' : 'click_count');

	$sort = (isset($_REQUEST['sort'])  && in_array(trim(strtolower($_REQUEST['sort'])), array('goods_id', 'shop_price', 'click_count'))) ? trim($_REQUEST['sort'])  : $default_sort_order_type;
	$order = (isset($_REQUEST['order']) && in_array(trim(strtoupper($_REQUEST['order'])), array('ASC', 'DESC'))) ? trim($_REQUEST['order']) : $default_sort_order_method;
	$display  = (isset($_REQUEST['display']) && in_array(trim(strtolower($_REQUEST['display'])), array('list', 'grid', 'text'))) ? trim($_REQUEST['display'])  : (isset($_SESSION['display_search']) ? $_SESSION['display_search'] : $default_display_type);

	$_SESSION['display_search'] = $display;

	$page	   = !empty($_REQUEST['page'])  && intval($_REQUEST['page'])  > 0 ? intval($_REQUEST['page'])  : 1;
	$size	   = !empty($_CFG['page_size']) && intval($_CFG['page_size']) > 0 ? intval($_CFG['page_size']) : 10;

	$intromode = '';	//方式，用于决定搜索结果页标题图片

	if (!empty($_REQUEST['intro']))
	{
		switch ($_REQUEST['intro'])
		{
			case 'best':
				$intro   = ' AND g.is_best = 1';
				$intromode = 'best';
				$ur_here = $_LANG['best_goods'];
				break;
			case 'new':
				$intro   = ' AND g.is_new = 1';
				$intromode ='new';
				$ur_here = $_LANG['new_goods'];
				break;
			case 'hot':
				$intro   = ' AND g.is_hot = 1';
				$intromode = 'hot';
				$ur_here = $_LANG['hot_goods'];
				break;
			case 'promotion':
				$time	= gmtime();
				$intro   = " AND g.promote_price > 0 AND g.promote_start_date <= '$time' AND g.promote_end_date >= '$time'";
				$intromode = 'promotion';
				$ur_here = $_LANG['promotion_goods'];
				break;
			default:
				$intro   = '';
		}
	}
	else
	{
		$intro = '';
	}



	/*------------------------------------------------------ */
	//-- 属性检索
	/*------------------------------------------------------ */
	$attr_in  = '';
	$attr_num = 0;
	$attr_url = '';
	$attr_arg = array();

	if (!empty($_REQUEST['attr']))
	{
		$sql = "SELECT goods_id, COUNT(*) AS num FROM " . $ecs->table("goods_attr") . " WHERE 0 ";
		foreach ($_REQUEST['attr'] AS $key => $val)
		{
			if (is_not_null($val) && is_numeric($key))
			{
				$attr_num++;
				$sql .= " OR (1 ";

				if (is_array($val))
				{
					$sql .= " AND attr_id = '$key'";

					if (!empty($val['from']))
					{
						$sql .= is_numeric($val['from']) ? " AND attr_value >= " . floatval($val['from'])  : " AND attr_value >= '$val[from]'";
						$attr_arg["attr[$key][from]"] = $val['from'];
						$attr_url .= "&amp;attr[$key][from]=$val[from]";
					}

					if (!empty($val['to']))
					{
						$sql .= is_numeric($val['to']) ? " AND attr_value <= " . floatval($val['to']) : " AND attr_value <= '$val[to]'";
						$attr_arg["attr[$key][to]"] = $val['to'];
						$attr_url .= "&amp;attr[$key][to]=$val[to]";
					}
				}
				else
				{
					/* 处理选购中心过来的链接 */
					$sql .= isset($_REQUEST['pickout']) ? " AND attr_id = '$key' AND attr_value = '" . $val . "' " : " AND attr_id = '$key' AND attr_value LIKE '%" . mysql_like_quote($val) . "%' ";
					$attr_url .= "&amp;attr[$key]=$val";
					$attr_arg["attr[$key]"] = $val;
				}

				$sql .= ')';
			}
		}

		/* 如果检索条件都是无效的，就不用检索 */
		if ($attr_num > 0)
		{
			$sql .= " GROUP BY goods_id HAVING num = '$attr_num'";

			$row = $db->getCol($sql);
			if (count($row))
			{
				$attr_in = " AND " . db_create_in($row, 'g.goods_id');
			}
			else
			{
				$attr_in = " AND 0 ";
			}
		}
	}
	elseif (isset($_REQUEST['pickout']))
	{
		/* 从选购中心进入的链接 */
		$sql = "SELECT DISTINCT(goods_id) FROM " . $ecs->table('goods_attr');
		$col = $db->getCol($sql);
		//如果商店没有设置商品属性,那么此检索条件是无效的
		if (!empty($col))
		{
			$attr_in = " AND " . db_create_in($col, 'g.goods_id');
		}
	}

	/* 获得符合条件的商品总数 */
	$sql   = "SELECT COUNT(*) FROM " .$ecs->table('goods'). " AS g ".
		"WHERE g.is_delete = 0 AND g.is_on_sale = 1 AND g.is_alone_sale = 1 $attr_in ".
		"AND (( 1 " . $categories . $keywords . $brand . $min_price . $max_price . $intro . $outstock ." ) ".$tag_where." )";
	$count = $db->getOne($sql);

	$max_page = ($count> 0) ? ceil($count / $size) : 1;
	if ($page > $max_page)
	{
		$page = $max_page;
	}

	/* 查询商品 */
	$sql = "SELECT g.goods_id, g.goods_name, g.market_price, g.is_new, g.is_best, g.is_hot, g.shop_price AS org_price, ".
				"IFNULL(mp.user_price, g.shop_price * '$_SESSION[discount]') AS shop_price, ".
				"g.promote_price, g.promote_start_date, g.promote_end_date, g.goods_thumb, g.goods_img, g.goods_brief, g.goods_type ".
			"FROM " .$ecs->table('goods'). " AS g ".
			"LEFT JOIN " . $GLOBALS['ecs']->table('member_price') . " AS mp ".
					"ON mp.goods_id = g.goods_id AND mp.user_rank = '$_SESSION[user_rank]' ".
			"WHERE g.is_delete = 0 AND g.is_on_sale = 1 AND g.is_alone_sale = 1 $attr_in ".
				"AND (( 1 " . $categories . $keywords . $brand . $min_price . $max_price . $intro . $outstock . " ) ".$tag_where." ) " .
			"ORDER BY $sort $order";
	$res = $db->SelectLimit($sql, $size, ($page - 1) * $size);

	$arr = array();
	while ($row = $db->FetchRow($res))
	{
		if ($row['promote_price'] > 0)
		{
			$promote_price = bargain_price($row['promote_price'], $row['promote_start_date'], $row['promote_end_date']);
		}
		else
		{
			$promote_price = 0;
		}

		$arr[$row['goods_id']]['goods_id']	  = $row['goods_id'];
		$arr[$row['goods_id']]['goods_name']	  = $row['goods_name'];
		$arr[$row['goods_id']]['shop_price']	= price_format($row['shop_price']);
		$arr[$row['goods_id']]['promote_price'] = ($promote_price > 0) ? price_format($promote_price) : '';
		$arr[$row['goods_id']]['url']		   = build_uri('goods', array('gid' => $row['goods_id']), $row['goods_name']);
		$arr[$row['goods_id']]['goods_thumb']	  = $row['goods_thumb'];//16:53 2013-07-16
	}

	$smarty->assign('goods_data', $arr);
	$smarty->assign('keywords',   htmlspecialchars(stripslashes($_REQUEST['keywords'])));
	$smarty->assign('search_keywords',   stripslashes($_REQUEST['keywords']));

	/* 分页 */
	$url_format = "search.php?category=$category&amp;keywords=" . urlencode(stripslashes($_REQUEST['keywords'])) . "&amp;brand=" . $_REQUEST['brand']."&amp;action=".$action."&amp;goods_type=" . $_REQUEST['goods_type'] . "&amp;sc_ds=" . $_REQUEST['sc_ds'];
	if (!empty($_REQUEST['intro']))
	{
		$url_format .= "&amp;intro=" . $_REQUEST['intro'];
	}
	if (isset($_REQUEST['pickout']))
	{
		$url_format .= '&amp;pickout=1';
	}
	$url_format .= "&amp;min_price=" . $_REQUEST['min_price'] ."&amp;max_price=" . $_REQUEST['max_price'] . "&amp;sort=$sort";

	$url_format .= "$attr_url&amp;order=$order&amp;page=";

	$pager['search'] = array(
		'keywords'   => stripslashes(urlencode($_REQUEST['keywords'])),
		'category'   => $category,
		'brand'	  => $_REQUEST['brand'],
		'sort'	   => $sort,
		'order'	  => $order,
		/*
		'min_price'  => $_REQUEST['min_price'],
		'max_price'  => $_REQUEST['max_price'],
		'action'	 => $action,
		'intro'	  => empty($_REQUEST['intro']) ? '' : trim($_REQUEST['intro']),
		'goods_type' => $_REQUEST['goods_type'],
		'sc_ds'	  => $_REQUEST['sc_ds'],
		'outstock'   => $_REQUEST['outstock']
		*/
	);
	$pager['search'] = array_merge($pager['search'], $attr_arg);
	$pager = get_pager('search.php', $pager['search'], $count, $page, $size);
	$smarty->assign('pager', $pager);

	$pagebar = get_wap_pager($count, $size, $page, $url_format, 'page');
	$smarty->assign('pagebar' , $pagebar);

	$_LANG['sort']['goods_id'] = '按上架时间排序';
	$_LANG['sort']['shop_price'] = '按价格排序';
	$_LANG['sort']['click_count'] = '按人气排序';
	$_LANG['order']['DESC'] = '倒序';
	$_LANG['order']['ASC'] = '正序';

	$smarty->assign('lang' , $_LANG);

	assign_dynamic('search');


	if (!empty($GLOBALS['_CFG']['search_keywords']))
	{
		$searchkeywords = explode(',', trim($GLOBALS['_CFG']['search_keywords']));
	}
	else
	{
		$searchkeywords = array();
	}
	$smarty->assign('searchkeywords', $searchkeywords);
	$smarty->assign('footer', get_footer());
	$smarty->display('search.dwt');
}

/*------------------------------------------------------ */
//-- PRIVATE FUNCTION
/*------------------------------------------------------ */
/**
 *
 *
 * @access public
 * @param
 *
 * @return void
 */
function is_not_null($value)
{
	if (is_array($value))
	{
		return (!empty($value['from'])) || (!empty($value['to']));
	}
	else
	{
		return !empty($value);
	}
}

/**
 * 获得可以检索的属性
 *
 * @access  public
 * @params  integer $cat_id
 * @return  void
 */
function get_seachable_attributes($cat_id = 0)
{
	$attributes = array(
		'cate' => array(),
		'attr' => array()
	);

	/* 获得可用的商品类型 */
	$sql = "SELECT t.cat_id, cat_name FROM " .$GLOBALS['ecs']->table('goods_type'). " AS t, ".
		   $GLOBALS['ecs']->table('attribute') ." AS a".
		   " WHERE t.cat_id = a.cat_id AND t.enabled = 1 AND a.attr_index > 0 ";
	$cat = $GLOBALS['db']->getAll($sql);

	/* 获取可以检索的属性 */
	if (!empty($cat))
	{
		foreach ($cat AS $val)
		{
			$attributes['cate'][$val['cat_id']] = $val['cat_name'];
		}
		$where = $cat_id > 0 ? ' AND a.cat_id = ' . $cat_id : " AND a.cat_id = " . $cat[0]['cat_id'];

		$sql = 'SELECT attr_id, attr_name, attr_input_type, attr_type, attr_values, attr_index, sort_order ' .
			   ' FROM ' . $GLOBALS['ecs']->table('attribute') . ' AS a ' .
			   ' WHERE a.attr_index > 0 ' .$where.
			   ' ORDER BY cat_id, sort_order ASC';
		$res = $GLOBALS['db']->query($sql);

		while ($row = $GLOBALS['db']->FetchRow($res))
		{
			if ($row['attr_index'] == 1 && $row['attr_input_type'] == 1)
			{
				$row['attr_values'] = str_replace("\r", '', $row['attr_values']);
				$options = explode("\n", $row['attr_values']);

				$attr_value = array();
				foreach ($options AS $opt)
				{
					$attr_value[$opt] = $opt;
				}
				$attributes['attr'][] = array(
					'id'	  => $row['attr_id'],
					'attr'	=> $row['attr_name'],
					'options' => $attr_value,
					'type'	=> 3
				);
			}
			else
			{
				$attributes['attr'][] = array(
					'id'   => $row['attr_id'],
					'attr' => $row['attr_name'],
					'type' => $row['attr_index']
				);
			}
		}
	}

	return $attributes;
}
?>